package kgame5.pbe.atlantic {
	import kgame5.kutil.FPSMonitor;
	import kgame5.pbe.atlantic.event.GameCommandEvent;

	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.EventDispatcher;
	import flash.utils.Dictionary;

	/**
 * @author kk

 * 保持GameCommand:Command

 * 
 * --
 * 缺陷是，摄像机还没有作为一个GameUnit加入到体系中。它算是一个GameActor,有自己的FSM
 * 
 * demo
 * starup()
 * registerCommand()
 * 调用command添加各个实体
 * 
 * --
 * 实际使用中，直接实例化这个即可
 * EventDispatcher是为了GamePlay能向外部发送事件。比如提示“一大批敌人接近”.或者通知LevelManger说有坦克被销毁
 */
public class GamePlay extends EventDispatcher{
	
	//只是用来装载efh用的,装载3d视图的
	private var mc:Sprite;
	
	//命令
	private var dict_commands:Dictionary;//dict[commandName]=GameCommand
	
	//mc_c是最外层容器,放在构造函数里是比getDO()要好，防止遗失
	public function GamePlay(frameRate:int=20){
		
		mc=new Sprite();

		//注册命令 
		dict_commands=new Dictionary();	
		
		//调试,显示帧频
		mc.addChild(new FPSMonitor(frameRate,frameRate*0.7));
	}
	public function getDO():DisplayObject{
		return mc;
	}
	

	
	//注册各个commands,被外部用
	public function registerCommand(commandName:String,cmd:GameCommand):void{
		dict_commands[commandName]=cmd;
		
		cmd.addEventListener(GameCommandEvent.TYPE, onGameCommandEvent);
	}
	
	//这个被其他调用,注意需要被子类继承
	public function startup():void{

	}
	
	//使用完了则销毁
	public function dispose():void{
		
		
	}
	

	//每次当addEntity的时候，entity的GameCommand事件会注册到这里
	public function onGameCommandEvent(e:GameCommandEvent):void{
		executeCommand(e.commandName, e.data);
	}
	
	//对外提供的接口，执行命令 
	//被外部执行某个Command,比如被网络调用，或者是被其他Mediator通知。
	//注意，这个是作为Mediator里的一个comp集成到pureMVC中的
	public function executeCommand(commandName:String,data:Object):void{
		var gc:GameCommand=dict_commands[commandName] as GameCommand;
		if(gc!=null){
			gc.execute(data);
		}
	}
	

	
}//end of class
}
